/**
* \file		Ville.h
* \brief	Définit la structure d'une Ville
* \details	C'est ici que sont définis la structure de la ville, ses
*		accesseurs, ses mutateurs.
*/

#ifndef VILLE_H
#define VILLE_H

#include "Entrepot.h"
#include "ArbreTech.h"
#include "Population.h"

/**
* \struct       ProductionVille
* \brief	Définition d'une Ville.
* \details	Cette structure contient les informations sur les paramètres d'une Ville
*/
typedef struct
{
  char* nomClan; /*!<Nom du clan de jeu*/
  Population* population; /*!<Lien vers la structure Population de la ville*/
  Entrepot* reserves; /*!<lien vers les recerves de la ville contenues dans l'entrepot*/
  ArbreTech* arbreTech; /*!<lien vers l'arbre des technologies*/
}Ville;


/**
 * \fn         void initVille(Ville* ville)
 * \brief      initialise les valeurs d'une ville
 * \details
 * \param      ville pointeur sur la ville à initialiser
 */
void initVille(Ville* ville);

/**
* \fn           void creerVille(Ville** ville)
* \brief        Créé une structure VilleProduction
* \details	Alloue de la mémoire à la Ville initialise ses valeurs avec initVille
* \param        ville     Pointeur sur le pointeur de la Ville à initialiser
*/
void creerVille(Ville** ville);

/** 
 * \fn         void detruireVille(Ville** ville)
 * \brief      libère la mémoire prise allouée à la ville
 * \details
 * \param      ville      Pointeur sur le pointeur de la ville à détruire
 */
void detruireVille(Ville* ville);

/**
 * \fn         void ajouterMembresVille(Ville* ville)
 * \brief      ajoute un membre à la ville
 * \details
 * \param      ville pointeur sur la ville ciblée
 */
void ajouterMembreVille(Ville* ville);

/**
 * \fn         void retirerMembresVille(Ville* ville, Personnage *personnage)
 * \brief      enleve un membre à la ville
 * \details
 * \param      ville pointeur sur la ville ciblée
 */
void retirerMembreVille(Ville* ville, Personnage *personnage);

/**
 * \fn         char* getNomClan(Ville* ville)
 * \brief      renvois la chaine de caracères du nom du clan
 * \details
 * \param      ville pointeur sur la ville ciblée
 */
char* getNomClan(Ville* ville);

/**
 * \fn         unsigned int getEffectif()
 * \brief      renvois l'effectif actuel dans la ville
 * \details
 * \param      ville   Pointeur sur la ville
 */
unsigned int getEffectif(Ville* ville);

/**
 * \fn         Entrepot* getReserves(Ville* ville)
 * \brief      Renvois un pointeur sur l'entrepot de la ville
 * \details
 * \param      ville   Pointeur sur la ville
 */
Entrepot* getReserves(Ville* ville);

/**
 * \fn         void setNomClan(Ville* ville, char* nouvNom)
 * \brief      attibue un nom de clan à la ville passée en argument
 * \details
 * \param      ville   Pointeur sur la ville
 * \param      nouvNom Chaine de caactère du nouveau nom
 */
void setNomClan(Ville* ville, char* nouvNom);

/**
 * \fn        void calcPrioriteComportements(Ville* ville, Personnage* personnage)
 * \brief     attribue un comportement rentable pour la ville au personnage donné en argument
 * \details
 * \param     ville   Pointeur sur la ville
 * \param     personnage Pointeur sur le personnage auquel attribuer un comportement
 */
void calcPrioriteComportements(Ville* ville, Personnage* personnage);

/**
 * \fn       unsigned int calcDepartPop(Ville* ville)
 * \brief    renvois le nombre de parsonnages quittant la ville en fonction des paramètres démographiques
 * \details
 * \param    ville   Pointeur sur la ville
 */
unsigned int calcDepartPop(Ville* ville);

/**  
 * \fn       unsigned int calcArriveesPop(Ville* ville)
 * \brief    calcule le nombre de personnage arrivant dans la ville en fonction des paramètres démographiques
 * \details
 * \param    ville   Pointeur sur la ville
 */
unsigned int calcArriveesPop(Ville* ville);

/**
 * \fn       unsigned int calcConsomationNourr(Ville* ville)
 * \brief    renvois la nourriture consommée par pas de temps par les personnages
 * \details
 * \param    ville   Pointeur sur la ville
 */
unsigned int calcConsomationNourr(Ville* ville);

/**
 * \fn      int calcEvolutionMoral(Ville* ville)
 * \brief   renvois l'évolution générale du morale au sein de la ville
 * \details
 * \param   ville   Pointeur sur la ville
 */
int calcEvolutionMoral(Ville* ville);

/**
* \brief	Développe une technologie dont on aura passé l'ID
* \details	Edite le champ dev de la technologie dont on a passé l'ID,
*		le tableau de prérequis des technologies qui la nécessitent
*               et les valeurs des bonus/malus induits
* \param        ville           Pointeur sur la ville
* \param	pAT		Pointeur vers un arbre des technologies
* \param	pSA		Pointeur vers un sous-arbre
*/
void devTechArbreTechVille(Ville* ville, ArbreTech *pAT, int IDTech);

/**
 * \fn      void incrementePasDeTemps(Ville* ville)
 * \brief   fait évoluer la ville d'un pas de temps en modifiant ses paramètres en conséquence
 * \details
 * \param    ville   Pointeur sur la ville
 */
void incrementePasDeTemps(Ville* ville);

#endif
